package ar.uade.edu.fain.ad.client.delegate.rmi;

import java.rmi.RemoteException;
import java.util.List;
import java.util.Set;

import ar.uade.edu.fain.ad.client.delegate.SalonServiceDelegate;
import ar.uade.edu.fain.ad.client.delegate.rmi.util.ServiceLocator;
import ar.uade.edu.fain.ad.client.exception.UnavailableServerException;
import ar.uade.edu.fain.ad.common.exception.MesaNoDisponibleException;
import ar.uade.edu.fain.ad.common.exception.PedidoCerradoException;
import ar.uade.edu.fain.ad.common.exception.ProductoNoDisponibleException;
import ar.uade.edu.fain.ad.common.remote.SalonServicioRemoto;
import ar.uade.edu.fain.ad.common.transfer.ComandaVO;
import ar.uade.edu.fain.ad.common.transfer.MesaVO;
import ar.uade.edu.fain.ad.common.transfer.MozoVO;
import ar.uade.edu.fain.ad.common.transfer.PedidoVO;
import ar.uade.edu.fain.ad.common.transfer.SalonVO;
import ar.uade.edu.fain.ad.common.transfer.SectorVO;

public class SalonSRVD implements SalonServiceDelegate {

	private ServiceLocator<SalonServicioRemoto> locator;

	public SalonSRVD(ServiceLocator<SalonServicioRemoto> locator) {
		super();
		this.locator = locator;
	}

	public ServiceLocator<SalonServicioRemoto> getLocator() {
		return locator;
	}

	public SalonServicioRemoto getRemoteService()
			throws UnavailableServerException {
		return locator.getRemoteService();
	}

	
	@Override
	public List<SectorVO> buscarSectoresEn(final SalonVO salonVO) {
		try {
			return getRemoteService().buscarSectoresEn(salonVO);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}
	
	@Override
	public Set<MesaVO> buscarMesasDisponiblesEn(SectorVO sectorVO,
			Integer cantidadComensales) {
		try {
			return getRemoteService()
					.buscarMesasDisponiblesEn(sectorVO, cantidadComensales);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}

	@Override
	public PedidoVO abrirPedido(MozoVO mozoVO, Set<MesaVO> mesaVOs)
			throws MesaNoDisponibleException {
		try {
			return getRemoteService().abrirPedido(mozoVO, mesaVOs);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}

	@Override
	public void agregarComanda(PedidoVO pedidoVO, ComandaVO comandaVOs)
			throws ProductoNoDisponibleException {
		try {
			getRemoteService().agregarComanda(pedidoVO, comandaVOs);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}

	@Override
	public Set<MesaVO> buscarMesasOcupadas(SalonVO salonVO) {
		try {
			return getRemoteService().buscarMesasOcupadas(salonVO);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}

	@Override
	public Set<PedidoVO> buscarPedidosActivos(SalonVO salonVO) {
		try {
			return getRemoteService().buscarPedidosActivos(salonVO);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}
	
	@Override
	public void cerrarPedido(PedidoVO pedidoVO) throws PedidoCerradoException {
		try {
			getRemoteService().cerrarPedido(pedidoVO);
		} catch (RemoteException e) {
			throw new UnavailableServerException(
					"Error ejecutando remotamente.", e);
		} catch (UnavailableServerException e) {
			throw e;
		}
	}

}
